package com.springboot.file.util.easyexcel.strategy;

import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;

import java.util.Iterator;

/**
 * 自定义行高策略
 */
public class CustomHeightStyleStrategy extends AbstractRowHeightStyleStrategy {
    /**
     * 默认高度
     */
    private static final Integer DEFAULT_HEIGHT = 300;
    
    /**
     * 每行最大字符数，超过此数量将进行换行处理
     */
    private static final int MAX_CHARS_PER_LINE = 50;

    /**
     * 设置表头行高
     * 不设置表头行高，使用EasyExcel默认的行高处理
     * 表头行高通过@HeadRowHeight注解或其他策略处理
     */
    @Override
    protected void setHeadColumnHeight(Row row, int relativeRowIndex) {
        // 空实现，表头高度由其他地方控制
    }

    /**
     * 设置内容行高
     */
    @Override
    protected void setContentColumnHeight(Row row, int relativeRowIndex) {
        Iterator<Cell> cellIterator = row.cellIterator();
        if (!cellIterator.hasNext()) {
            return;
        }
        
        // 计算行中所有单元格所需的最大行数
        int maxRowCount = calculateMaxRowCount(cellIterator);
        
        // 设置行高
        row.setHeight((short) (maxRowCount * DEFAULT_HEIGHT));
    }
    
    /**
     * 计算行中所有单元格需要的最大行数
     * 
     * @param cellIterator 单元格迭代器
     * @return 最大行数
     */
    private int calculateMaxRowCount(Iterator<Cell> cellIterator) {
        // 默认为1行高度
        int maxRowCount = 1;
        
        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            if (cell.getCellType() == CellType.STRING) {
                // 计算单元格内容需要的行数
                int cellRowCount = calculateCellRowCount(cell.getStringCellValue());
                maxRowCount = Math.max(maxRowCount, cellRowCount);
            }
        }
        
        return maxRowCount;
    }
    
    /**
     * 计算单元格文本内容需要的行数
     * 
     * @param cellValue 单元格文本值
     * @return 需要的行数
     */
    private int calculateCellRowCount(String cellValue) {
        // 如果已包含换行符，直接计算行数
        if (cellValue.contains("\n")) {
            return cellValue.split("\n").length + 1;
        }
        
        // 如果内容长度不需要换行，返回1
        int textLength = cellValue.length();
        if (textLength <= MAX_CHARS_PER_LINE) {
            return 1;
        }
        
        // 计算需要插入的换行符数量
        int extraLineBreaks = calculateExtraLineBreaks(textLength);
        
        // 行数等于换行符数量+1
        return extraLineBreaks + 1;
    }
    
    /**
     * 计算文本需要添加的换行符数量
     * 
     * @param textLength 文本长度
     * @return 需要添加的换行符数量
     */
    private int calculateExtraLineBreaks(int textLength) {
        if (textLength <= MAX_CHARS_PER_LINE) {
            return 0;
        }
        
        // 计算需要的换行符数量
        return textLength % MAX_CHARS_PER_LINE > 0 ? 
               textLength / MAX_CHARS_PER_LINE : 
               textLength / 2 - 1;
    }
}
